package sv;

/**
 * Classe che si occupa della generazione dei nodi dell'albero
 * 
 * @author Michele
 * 
 */
public class Node {

	private boolean[][][] matrix;
	private boolean[][] choose;

	public Node(boolean[][][] matrix, boolean[][] choose, ToolBox tb,
			OutputWindow oWindow, int r, // costruttore
			int c, int nS, boolean show) {
		this.matrix = matrix;
		this.choose = choose;
		// aggiorna i vincoli, crea e chiama ricorsivamente i nodi figli,
		// muore quando non ci sono piu' possibilita'

		if (Solver.controllaVincoli(matrix, nS)) { // problema risolvibile
			if(show)
				Solver.mostarInFinestra(matrix, oWindow);
			int rit = ToolBox.getRit();
			Object wait = ToolBox.getWait();
			if (rit > 0) {
				try {
					synchronized (wait) {
						wait.wait(rit);
					}
				} catch (java.lang.InterruptedException ie) {
				}
			}

			int nc = c + 1;
			int nr = r;
			if (nc > 8) {
				nr++;
				nc = 0;
			}

			int[] index = null;
			if (nS == 0) {
				index = Solver.getIndex(matrix, nc, nr, nS);
				// System.out.println(index[0] + " " + index[1]);
			}
			if (nS == 1) {
				index = Solver.getIndex(matrix, nS, choose);
			}
			// System.out.println(index[0] + " " + index[1]);
			if (index[0] != -1) {
				if (nS == 1)
					Solver.setChoose(true, index[0], index[1], choose);
				// dato che ho ricevuto questo indice sono sicuro di avere piu'
				// valori
				int[] values = Solver.possibleValues(
						matrix[index[0]][index[1]], nS);
				for (int i = 0; i < values.length && !tb.isOver(nS); i++) {
					tb.addPassi(nS);
					if(show)
						oWindow.setCas(index[0], index[1]);
					// crea un nodo per ogni possibile figlio
					boolean[] set = new boolean[] { false, false, false, false,
							false, false, false, false, false };
					set[values[i] - 1] = true;
					boolean[][][] newMatrix = Solver.copyMatrix(matrix);
					newMatrix[index[0]][index[1]] = set;
					Node node = new Node(newMatrix, choose, tb, oWindow,
							index[0], index[1], nS, show);
				}
				if(show)
					oWindow.setCas(index[0], index[1]);
				if (nS == 1)
					Solver.setChoose(false, index[0], index[1], choose);
			} else {
				tb.setOver(nS);
				// TODO finito
			}
		}
	}
}
